// Copyright (c) 2017-2019 Intel Corporation
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
#ifndef __MFXLA_H__
#define __MFXLA_H__
#include "mfxdefs.h"
#include "mfxvstructures.h"

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

enum {
  MFX_DEPRECATED_ENUM_FIELD_INSIDE(MFX_EXTBUFF_LOOKAHEAD_CTRL) =
      MFX_MAKEFOURCC('L', 'A', 'C', 'T'),
  MFX_DEPRECATED_ENUM_FIELD_INSIDE(MFX_EXTBUFF_LOOKAHEAD_STAT) =
      MFX_MAKEFOURCC('L', 'A', 'S', 'T'),
};

MFX_DEPRECATED_ENUM_FIELD_OUTSIDE(MFX_EXTBUFF_LOOKAHEAD_CTRL);
MFX_DEPRECATED_ENUM_FIELD_OUTSIDE(MFX_EXTBUFF_LOOKAHEAD_STAT);

MFX_PACK_BEGIN_USUAL_STRUCT()
MFX_DEPRECATED typedef struct {
  mfxExtBuffer Header;
  mfxU16 LookAheadDepth;
  mfxU16 DependencyDepth;
  mfxU16 DownScaleFactor;
  mfxU16 BPyramid;

  mfxU16 reserved1[23];

  mfxU16 NumOutStream;
  struct mfxStream {
    mfxU16 Width;
    mfxU16 Height;
    mfxU16 reserved2[14];
  } OutStream[16];
} mfxExtLAControl;
MFX_PACK_END()

MFX_PACK_BEGIN_STRUCT_W_L_TYPE()
MFX_DEPRECATED typedef struct {
  mfxU16 Width;
  mfxU16 Height;

  mfxU32 FrameType;
  mfxU32 FrameDisplayOrder;
  mfxU32 FrameEncodeOrder;

  mfxU32 IntraCost;
  mfxU32 InterCost;
  mfxU32 DependencyCost;  // aggregated cost, how this frame influences
                          // subsequent frames
  mfxU16 Layer;
  mfxU16 reserved[23];

  mfxU64 EstimatedRate[52];
} mfxLAFrameInfo;
MFX_PACK_END()

MFX_PACK_BEGIN_STRUCT_W_PTR()
MFX_DEPRECATED typedef struct {
  mfxExtBuffer Header;

  mfxU16 reserved[20];

  mfxU16 NumAlloc;            // number of allocated mfxLAFrameInfo structures
  mfxU16 NumStream;           // number of resolutions
  mfxU16 NumFrame;            // number of frames for each resolution
  mfxLAFrameInfo* FrameStat;  // frame statistics

  mfxFrameSurface1* OutSurface;  // reordered surface

} mfxExtLAFrameStatistics;
MFX_PACK_END()

#ifdef __cplusplus
}      // extern "C"
#endif /* __cplusplus */

#endif
